<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件

function test($a = 1, $b = 1){
	$c = $a + $b;
	return $c;
}

/**
* 防止sql注入自定义方法
* @param: mixed $value 参数值
*/
function post_check($value) {
	$value = htmlspecialchars($value, ENT_QUOTES);
	// $value = str_replace("_", "\_", $value);
	// $value = str_replace("%", "\%", $value);
	// if(!get_magic_quotes_gpc()){
		//php.ini中有一个设置：magic_quotes_gpc = Off；如果magic_quotes_gpc=Off，则使用addslashes()函数。
		// $value = addslashes($value);//应该是TP5底层做了处理，实测发现，即使这里不做处理，最终的SQL语句也会转义
	// }
	$value = nl2br($value);
	return $value;
}

/**
 * @param $url
 * @param int $type 0 get  1 post
 * @param array $data
 */
function doCurl($url, $type=0, $data=[]) {
	$ch = curl_init(); // 初始化
	// 设置选项
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_HEADER,0);

	if($type == 1) {
		// post
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
	}

	//执行并获取内容
	$output = curl_exec($ch);
	// 释放curl句柄
	curl_close($ch);
	return $output;
}

/**
 * 字节格式化 把字节数格式为 B KB M G T 描述的大小
 * @return string
 */
// echo byte_format(123456789);
function byte_format($size, $dec=2) {
	$byte = array("B", "KB", "MB", "GB", "TB", "PB");
	$unit = 0;
	while($size >= 1024){
		$size /= 1024;
		$unit++;
	}
	return round($size, $dec) . " " . $byte[$unit];
}

/**
* 转换字节数为其他单位
* @param  string  $filesize 字节大小
* @return string  返回大小
*/
function sizecount($filesize) {
	if ($filesize >= 1073741824) {
		$filesize = round($filesize / 1073741824 * 100) / 100 .' GB';
	} elseif ($filesize >= 1048576) {
		$filesize = round($filesize / 1048576 * 100) / 100 .' MB';
	} elseif($filesize >= 1024) {
		$filesize = round($filesize / 1024 * 100) / 100 . ' KB';
	} else {
		$filesize = $filesize.' Bytes';
	}
	return $filesize;
}

/**
* 生成随机字符串
* @param int $length  要生成的随机字符串长度
* @param string $type 随机码类型：0，数字+大小写字母；1，数字；2，小写字母；3，大写字母；4，特殊字符；-1，数字+大小写字母+特殊字符
* @return string
*/
function randCode($length = 5, $type = 0) {
	$arr = array(1 => "0123456789", 2 => "abcdefghijklmnopqrstuvwxyz", 3 => "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 4 => "~@#$%^&*(){}[]|");
	if ($type == 0) {
		array_pop($arr);
		$string = implode("", $arr);
	} else if ($type == "-1") {
		$string = implode("", $arr);
	} else {
		$string = $arr[$type];
	}
	$count = strlen($string) - 1;
	for ($i = 0; $i < $length; $i++) {
		$str[$i] = $string[rand(0, $count)];
		$code .= $str[$i];
	}
	return $code;
}

/**
 * 产生随机字串，可用来自动生成密码 默认长度6位 大小写字母和数字混合
 * @param string $len 长度
 * @param string $type 字串类型：0-纯数字；1-小写字母；2-大写字母；3-数字和小写字母；4-中文汉子
 * @param string $addChars 额外字符
 * @return string
 */
// echo rand_string(15, 4);
function rand_string($len=6, $type='', $addChars='') {
	$str = '';
	switch($type){
		case 0:
			$chars = str_repeat('0123456789',3);
			break;
		case 1:
			$chars='abcdefghijklmnopqrstuvwxyz'.$addChars;
			break;
		case 2:
			$chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ'.$addChars;
			break;
		case 3:
			$chars = str_repeat('0123456789',3).'abcdefghijklmnopqrstuvwxyz'.$addChars;
			break;
		case 4:
			$chars = "们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书术状厂须离再目海交权且儿青才证低越际八试规斯近注办布门铁需走议县兵固除般引齿千胜细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝仅针怎植京助升王眼她抓含苗副杂普谈围食射源例致酸旧却充足短划剂宣环落首尺波承粉践府鱼随考刻靠够满夫失包住促枝局菌杆周护岩师举曲春元超负砂封换太模贫减阳扬江析亩木言球朝医校古呢稻宋听唯输滑站另卫字鼓刚写刘微略范供阿块某功套友限项余倒卷创律雨让骨远帮初皮播优占死毒圈伟季训控激找叫云互跟裂粮粒母练塞钢顶策双留误础吸阻故寸盾晚丝女散焊功株亲院冷彻弹错散商视艺灭版烈零室轻血倍缺厘泵察绝富城冲喷壤简否柱李望盘磁雄似困巩益洲脱投送奴侧润盖挥距触星松送获兴独官混纪依未突架宽冬章湿偏纹吃执阀矿寨责熟稳夺硬价努翻奇甲预职评读背协损棉侵灰虽矛厚罗泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨奋械载胞幼哪剥迫旋征槽倒握担仍呀鲜吧卡粗介钻逐弱脚怕盐末阴丰雾冠丙街莱贝辐肠付吉渗瑞惊顿挤秒悬姆烂森糖圣凹陶词迟蚕亿矩康遵牧遭幅园腔订香肉弟屋敏恢忘编印蜂急拿扩伤飞露核缘游振操央伍域甚迅辉异序免纸夜乡久隶缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染既秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃剧堆赫荷胸衡勤膜篇登驻案刊秧缓凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋弧爆谬涂味津臂障褐陆啊健尊豆拔莫抵桑坡缝警挑污冰柬嘴啥饭塑寄赵喊垫丹渡耳刨虎笔稀昆浪萨茶滴浅拥穴覆伦娘吨浸袖珠雌妈紫戏塔锤震岁貌洁剖牢锋疑霸闪埔猛诉刷狠忽灾闹乔唐漏闻沈熔氯荒茎男凡抢像浆旁玻亦忠唱蒙予纷捕锁尤乘乌智淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借".$addChars;
			break;
		default:
			// 默认去掉了容易混淆的字符oOLl和数字01，要添加请使用addChars参数
			$chars='ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'.$addChars;
			break;
	}
	if($len > 10){//位数过长重复字符串一定次数
		$chars = $type == 1 ? str_repeat($chars, $len) : str_repeat($chars, 5);
	}
	if($type == 4){
		$chars_len = mb_strlen($chars, 'utf-8') - 1;
		for($i=0; $i<$len; $i++){
			$str .= mb_substr($chars, mt_rand(0, $chars_len), 1);
		}
	}else{
		$chars = str_shuffle($chars);
		$str = substr($chars, 0 ,$len);
	}
	return $str;
}

/**
* 删除目录及目录下所有文件或删除指定文件
* @param str $path待删除目录路径
* @param int $delDir 是否删除目录，1或true删除目录，0或false则只删除文件保留目录（包含子目录）
* @return bool 返回删除状态
*/
function delDirAndFile($path, $delDir = FALSE) {
	$message = "";
	$handle = opendir($path);
	if ($handle) {
		while (false !== ( $item = readdir($handle) )) {
			if ($item != "." && $item != "..") {
				if (is_dir("$path/$item")) {
					$msg = delDirAndFile("$path/$item", $delDir);
					if ( $msg ){
						$message .= $msg;
					}
				} else {
					$message .= "删除文件" . $item;
					if (unlink("$path/$item")){
						$message .= "成功<br />";
					} else {
						$message .= "失败<br />";
					}
				}
			}
		}
		closedir($handle);
		if ($delDir){
			if ( rmdir($path) ){
				$message .= "删除目录" . dirname($path) . "<br />";
			} else {
				$message .= "删除目录" . dirname($path) . "失败<br />";
			}
		}
	} else {
		if (file_exists($path)) {
			if (unlink($path)){
				$message .= "删除文件" . basename($path) . "<br />";
			} else {
				$message .= "删除文件" + basename($path) . "失败<br />";
			}
		} else {
			$message .= "文件" + basename($path) . "不存在<br />";
		}
	}
	return $message;
}

/**
* 将一个字符串部分字符用*替代隐藏
* @param string $string待转换的字符串
* @param int $bengin起始位置，从0开始计数，当$type=4时，表示左侧保留长度
* @param int $len需要转换成*的字符个数，当$type=4时，表示右侧保留长度
* @param int $type  转换类型：0，从左向右隐藏；1，从右向左隐藏；2，从指定字符位置分割前由右向左隐藏；3，从指定字符位置分割后由左向右隐藏；4，保留首末指定字符串
* @param string $glue  分割符
* @return string处理后的字符串
*/
// echo hideStr("18012345678",3,6,0,'a');
function hideStr($string, $bengin = 0, $len = 4, $type = 0, $glue = "@") {
	if (empty($string))
		return false;
	$array = array();
	if ($type == 0 || $type == 1 || $type == 4) {
		$strlen = $length = mb_strlen($string);
		while ($strlen) {
			$array[] = mb_substr($string, 0, 1, "utf8");
			$string = mb_substr($string, 1, $strlen, "utf8");
			$strlen = mb_strlen($string);
		}
	}
	switch ($type) {
		case 1:
		$array = array_reverse($array);
		for ($i = $bengin; $i < ($bengin + $len); $i++) {
			if (isset($array[$i]))
				$array[$i] = "*";
		}
		$string = implode("", array_reverse($array));
		break;
		case 2:
		$array = explode($glue, $string);
		$array[0] = hideStr($array[0], $bengin, $len, 1);
		$string = implode($glue, $array);
		break;
		case 3:
		$array = explode($glue, $string);
		$array[1] = hideStr($array[1], $bengin, $len, 0);
		$string = implode($glue, $array);
		break;
		case 4:
		$left = $bengin;
		$right = $len;
		$tem = array();
		for ($i = 0; $i < ($length - $right); $i++) {
			if (isset($array[$i]))
				$tem[] = $i >= $left ? "*" : $array[$i];
		}
		$array = array_chunk(array_reverse($array), $right);
		$array = array_reverse($array[0]);
		for ($i = 0; $i < $right; $i++) {
			$tem[] = $array[$i];
		}
		$string = implode("", $tem);
		break;
		default:
		for ($i = $bengin; $i < ($bengin + $len); $i++) {
			if (isset($array[$i]))
				$array[$i] = "*";
		}
		$string = implode("", $array);
		break;
	}
	return $string;
}

/**
* 返回经addslashes处理过的字符串或数组
* @param $string 需要处理的字符串或数组
* @return mixed
*/
function new_addslashes($string){
	if(!is_array($string)) return addslashes($string);
	foreach($string as $key => $val) $string[$key] = new_addslashes($val);
	return $string;
}

/**
* 返回经stripslashes处理过的字符串或数组
* @param $string 需要处理的字符串或数组
* @return mixed
*/
function new_stripslashes($string) {
	if(!is_array($string)) return stripslashes($string);
	foreach($string as $key => $val) $string[$key] = new_stripslashes($val);
	return $string;
}

/**
* 返回经htmlspecialchars处理过的字符串或数组
* @param $obj 需要处理的字符串或数组
* @return mixed
*/
function new_html_special_chars($string) {
	if(!is_array($string)) return htmlspecialchars($string);
	foreach($string as $key => $val) $string[$key] = new_html_special_chars($val);
	return $string;
}

/* 中文字符串截取方法
@param $str  需要处理的字符串
@param $start 开始截取的位置
@param $lenth 截取的长度
@return处理后的字符串
base_convert(3,10,2);在任意进制之间转换数字[这是把十进制的3转换成二进制数表示]（输出11）
ord();返回字符的 ASCII 码值[该函数是 chr() 的互补函数。 ]
 */
// echo substr_utf8("中s01文字符串ab截12取（php）", 0, 5);//从0开始，截取5个字符
function substr_utf8($str,$start,$lenth){
	$len=strlen($str);
	$r=array();
	$n=0;
	$m=0;
	for($i=0;$i<$len;$i++){
		$x=substr($str, $i,1);
		$a=base_convert(ord($x), 10, 2);
		$a=substr('00000000'.$a, -8);
		if($n<$start){
			if(substr($a, 0,1)==0){
				
			}elseif(substr($a, 0,3)==110){
				$i+=1;
			}elseif(substr($a, 0,4)==1110){
				$i+=2;
			}
			$n++;
		}else{
			if(substr($a, 0,1)==0){
				$r[]=substr($str, $i,1);
			}elseif(substr($a, 0,3)==110){
				$r[]=substr($str, $i,2);
				$i+=1;
			}elseif(substr($a, 0,4)==1110){
				$r[]=substr($str,$i,3);
				$i+=2;
			}else{
				$r[]="";
			}
			if(++$m>=$lenth){
				break;
			}
		}
	}
	return join($r);
}

/**
* 功能：检测一个目录是否存在，不存在则创建它
* @param string $path待检测的目录
* @return boolean
*/
// var_dump(makeDir('./dir'));
function makeDir($path) {
	return is_dir($path) or (makeDir(dirname($path)) and @mkdir($path, 0777));
}

/**
* 功能：检测一个字符串是否是邮件地址格式
* @param string $value 待检测字符串
* @return boolean
*/
// var_dump(is_email("1234562@qq.com"));
function is_email($value) {
	return preg_match("/^[0-9a-zA-Z]+(?:[\_\.\-][a-z0-9\-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\.[a-zA-Z]+$/i", $value);
}

/**
* 文件下载
* @param $filepath 文件路径
* @param $filename 文件名称
*/
// file_down("./dir/1.xlsx");
function file_down($filepath, $filename = '') {
	if(!$filename) $filename = basename($filepath);
	// if(is_ie()) $filename = rawurlencode($filename);
	$filetype = substr($filename, strrpos($filename, ".") + 1);
	$filesize = sprintf("%u", filesize($filepath));
	if(ob_get_length() !== false) @ob_end_clean();
	header('Pragma: public');
	header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
	header('Cache-Control: no-store, no-cache, must-revalidate');
	header('Cache-Control: pre-check=0, post-check=0, max-age=0');
	header('Content-Transfer-Encoding: binary');
	header('Content-Encoding: none');
	header('Content-type: '.$filetype);
	header('Content-Disposition: attachment; filename="'.$filename.'"');
	header('Content-length: '.$filesize);
	readfile($filepath);
	exit;
}

//数组中的健值要和id相同
$arr = array(
	1 => array('id' => 1, 'pid' => 0, 'name' => '中国', 'sell' => 999),
	2 => array('id' => 2, 'pid' => 1, 'name' => '湖北省', 'sell' => 200),
	3 => array('id' => 3, 'pid' => 1, 'name' => '上海', 'sell' => 309),
	4 => array('id' => 4, 'pid' => 2, 'name' => '武汉市', 'sell' => 50),
	5 => array('id' => 5, 'pid' => 2, 'name' => '仙桃市', 'sell' => 30),
	6 => array('id' => 6, 'pid' => 4, 'name' => '江汉区', 'sell' => 10),
	7 => array('id' => 7, 'pid' => 4, 'name' => '新洲区', 'sell' => 9),
	8 => array('id' => 8, 'pid' => 3, 'name' => '闵行区', 'sell' => 40),
	9 => array('id' => 9, 'pid' => 3, 'name' => '浦东区', 'sell' => 44),
	10=> array('id' => 10,'pid' => 7, 'name' => '邾城街', 'sell' => 3),
	11=> array('id' => 11,'pid' => 0, 'name' => '美国', 'sell' => 800),
	12=> array('id' => 12,'pid' =>11, 'name' => '纽约', 'sell' => 666)
);

/* 
 数据集转换成Tree（最简单的写法）
 */
// echo "<pre>";print_r(get_tree($arr));echo "</pre>";
function get_tree($arr){
	foreach($arr as $v){
		$arr[$v['pid']]['children'][]= &$arr[$v['id']];
	}
	return $arr[0];
}

/**
 * 把数据集转换成Tree
 * @access public
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 */
// echo "<pre>";print_r(list_to_tree($arr));echo "</pre>";
function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root=0) {
	// 创建Tree
	$tree = array();
	if(is_array($list)) {
		// 创建基于主键的数组引用
		$refer = array();
		foreach ($list as $k => $v) {
			$refer[$v[$pk]] =& $list[$k];
		}
		foreach ($list as $k => $v) {
			// 判断是否存在parent
			$parentId = $v[$pid];
			if ($root == $parentId) {
				$tree[$v[$pk]] =& $list[$k];
			}else{
				if (isset($refer[$parentId])) {
					$parent =& $refer[$parentId];
					$parent[$child][$v[$pk]] =& $list[$k];
				}
			}
		}
	}
	return $tree;
}

/**
 * 对查询结果集按指定字段进行排序
 * @access public
 * @param array $list 查询结果
 * @param string $field 排序的字段名
 * @param array $sortby 排序类型：asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
// echo "<pre>";print_r(list_sort_by($arr, 'sell'));echo "</pre>";
function list_sort_by($list,$field, $sortby='asc') {
	if(is_array($list)){
		$refer = $resultSet = array();
		foreach ($list as $k => $v){
			$refer[$k] = $v[$field];
		}
		switch ($sortby) {
			case 'asc': // 正向排序
				asort($refer);
				break;
			case 'desc':// 逆向排序
				arsort($refer);
				break;
			case 'nat': // 自然排序
				natcasesort($refer);
				break;
		}
		foreach ($refer as $k => $v){
			$resultSet[] = &$list[$k];
		}
		return $resultSet;
	}
	return false;
}

/**
 * 在数据列表（二维数组）中搜索
 * @access public
 * @param array $list 数据列表
 * @param mixed $condition 查询条件：支持 array('name'=>$value) 或者 name=$value
 * @return array
 */
// echo "<pre>";print_r(list_search($arr, ['name' => '区', 'sell' => '99']));echo "</pre>";
function list_search($list,$condition){
	if(is_string($condition)){
		parse_str($condition, $condition);
	}
	// 返回的结果集合
	$resultSet = array();
	foreach ($list as $key=>$data){
		$find = false;
		foreach ($condition as $k=>$v){
			if(isset($data[$k])) {
				$find = preg_match('/'.$v.'/', $data[$k]);
			}
			if($find){
				$resultSet[] = &$list[$key];
			}
		}
	}
	return $resultSet;
}








// echo hideStr("./test",4);

?>